home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / MPW_C / SPELL__ / PRINT.C < prev    next >
Text File  |  1990-07-03  |  3KB  |  148 lines

  1. /*
  2.  
  3.     File:    print.c
  4.     Author:  Graham Toal
  5.     Purpose: Print a packed trie to stderr.
  6.     Functions exported:  dawg_print, pack_print, dawg_print_prefix
  7.     Internal functions:  pack_pr dawg_pr dawg_pr_prefix
  8.  
  9. Description:
  10.   Pre-order traverse of packed TRIE or DAWG.  Will be modified
  11.   soon to take output file as parameter.  Then sometime after that
  12.   to callback with each string at it is generated.  Meanwhile,
  13.   people requiring custom versions of dawg-walking stuff might
  14.   as well just copy this code and edit it to do what they want.
  15.  
  16.   The special version print_dawg_prefix takes a NODE from somewhere
  17.   in a dict as a parameter, and prints out only those words which
  18.   contain that node.  You have to locate the node seperately with
  19.   'locate_prefix', and pass the prefix string in so it can be printed.
  20.  
  21. */
  22.  
  23. static void
  24. #ifdef PROTOTYPES
  25. dawg_pr(NODE PCCRAP *dawg, INDEX node, int len)
  26. #else
  27. dawg_pr(dawg, node, len)
  28. NODE PCCRAP *dawg;
  29. INDEX node;
  30. int len;
  31. #endif
  32. {
  33.   static char word[MAX_WORD_LEN];
  34.   NODE PCCRAP *edge;
  35.  
  36.   for (edge = (NODE PCCRAP *)&dawg[node]; ; edge++) {
  37.   long c;
  38.     c = *edge;           /* Don't rewrite this - its avoiding a MSC bug */
  39.     c = c >> V_LETTER;
  40.     c = c & M_LETTER;
  41.     word[len] = (char)c;
  42.     if ((*edge & M_END_OF_WORD) != 0) {
  43.       word[len+1] = '\0';
  44.       fprintf(stdout, "%s\n", word);
  45.     }
  46.     c = *edge & M_NODE_POINTER;
  47.     if ((*edge & M_NODE_POINTER) != 0)
  48.       dawg_pr (dawg, c, len + 1);
  49.     if ((*edge & M_END_OF_NODE) != 0) break; /* End of node */
  50.   }
  51. }
  52.  
  53. void
  54. #ifdef PROTOTYPES
  55. dawg_print(NODE PCCRAP *dawg, INDEX node)
  56. #else
  57. dawg_print(dawg, node)
  58. NODE PCCRAP *dawg;
  59. INDEX node;
  60. #endif
  61. {
  62.   dawg_pr(dawg, node, 0);
  63. }
  64.  
  65. static void
  66. #ifdef PROTOTYPES
  67. pack_pr(NODE PCCRAP *ptrie, INDEX i, int pos)
  68. #else
  69. pack_pr(ptrie, i, pos)
  70. NODE PCCRAP *ptrie;
  71. INDEX i;
  72. int pos;
  73. #endif
  74. {
  75. static char s[MAX_WORD_LEN+1];
  76. int b;
  77. INDEX p;
  78.   for (b = BASE_CHAR; b < BASE_CHAR+MAX_CHARS; b++) {
  79.     if (b != 0) {
  80.       p = ptrie[i+b-BASE_CHAR];
  81.       if (((p>>V_LETTER)&M_LETTER) == b) {
  82.           s[pos] = b; s[pos+1] = '\0';
  83.         if ((p & M_END_OF_WORD) != 0) fprintf(stderr, "%s\n", s);
  84.         if ((p &= M_NODE_POINTER) != 0) {
  85.           pack_pr(ptrie, p, pos+1);
  86.         }
  87.       }
  88.     }
  89.   }
  90. }
  91.  
  92.  
  93. void
  94. #ifdef PROTOTYPES
  95. pack_print(NODE PCCRAP *ptrie, INDEX node)
  96. #else
  97. pack_print(ptrie, node)
  98. NODE PCCRAP *ptrie;
  99. INDEX node;
  100. #endif
  101. {
  102.   pack_pr(ptrie, node, 0);
  103. }
  104.  
  105.  
  106. static void
  107. #ifdef PROTOTYPES
  108. dawg_pr_prefix(NODE PCCRAP *dawg, char *prefix, INDEX node, int len)
  109. #else
  110. dawg_pr_prefix(dawg, prefix, node, len)
  111. NODE PCCRAP *dawg;
  112. char *prefix;
  113. INDEX node;
  114. int len;
  115. #endif
  116. {
  117.   NODE PCCRAP *edge;
  118.   static char word[MAX_WORD_LEN];
  119.   long c;
  120.  
  121.   for (edge = (NODE PCCRAP *)&dawg[node]; ; edge++) {
  122.     /* Don't 'fix' - compiler bugaround for microsoft :-( */
  123.     c = *edge; c = c >> V_LETTER; c = c & M_LETTER;
  124.     word[len] = (char)c;
  125.     if ((*edge & M_END_OF_WORD) != 0) {
  126.       word[len+1] = 0;
  127.       fprintf(stdout, "%s%s\n", prefix, word);
  128.     }
  129.     c = *edge & M_NODE_POINTER;
  130.     if (c != 0) dawg_pr_prefix(dawg, prefix, c, len + 1);
  131.     /* End of node - check repair later - I accidentally nobbled it */
  132.     if ((*edge & M_END_OF_NODE) != 0) break;
  133.   }
  134. }
  135.  
  136. void
  137. #ifdef PROTOTYPES
  138. dawg_print_prefix(NODE PCCRAP *dawg, char *prefix, INDEX node)
  139. #else
  140. dawg_print_prefix(dawg, prefix, node)
  141. NODE PCCRAP *dawg;
  142. char *prefix;
  143. INDEX node;
  144. #endif
  145. {
  146.   dawg_pr_prefix(dawg, prefix, node, 0);
  147. }
  148.